00000 -> Pb-Pb
00001 -> Pb-Sn
00010 -> Pb-Fe
00011 -> Pb-Cu
00100 -> Sn-Pb
00101 -> Sn-Sn
00110 -> Sn-Fe
00111 -> Sn-Cu

01000 -> Fe-Pb
01001 -> Fe-Sn
01010 -> Fe-Fe
01011 -> Fe-Cu
01100 -> Cu-Pb
01101 -> Cu-Sn
01110 -> Cu-Fe
01111 -> Cu-Cu

10000 -> Au-Pb
10001 -> Au-Sn
10010 -> Au-Fe
10011 -> Au-Cu
10100 -> Pb-Au
10101 -> Sn-Au
10110 -> Fe-Au
10111 -> Cu-Au

11000 -> Ag-Pb
11001 -> Ag-Sn
11010 -> Ag-Fe
11011 -> Ag-Cu
11100 -> Pb-Ag
11101 -> Sn-Ag
11110 -> Fe-Ag
11111 -> Cu-Ag

Remaining:
Ag-Ag
Ag-Au
Au-Ag
Au-Au

Translate ---XX (00, 01, 10, 11) to (Pb, Sn, Fe, Cu) for RH Atom
IF 10--- THEN LH Atom=Au ELSE
IF 11--- THEN LH Atom=Ag AND IF --1-- THEN SwapOutputAtomsAround ELSE
Translate -XX-- (00, 01, 10, 11) to (Pb, Sn, Fe, Cu)

It was a tough assignment, yet somehow I managed to get it to work... a lot of clunky fiddling to avoid collisions and dispose / chain waste! I'm sure further improvements could be made but getting the bloody thing working in all cases without collisions was my priority...! Managed to tweak and improve slightly since first submission, even managing to get 'budget encoding' (under 1000G)!